#define _CRT_SECURE_NO_WARNINGS 1

#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>

using namespace std;

//typedef pair<int, int> PII;
//
//const int N = 2010;
//
//int a[N], b[N], c[N];
//int n, m;
//
//void merge()
//{
//    priority_queue<PII, vector<PII>, greater<PII>> heap;
//    for (int i = 0; i < n; i++)    heap.push({ a[0] + b[i],0 });
//    for (int i = 0; i < n; i++)
//    {
//        auto t = heap.top();
//        heap.pop();
//        int s = t.first, p = t.second;
//        c[i] = s;
//        heap.push({ s - a[p] + a[p + 1],p + 1 });
//    }
//    for (int i = 0; i < n; i++)    a[i] = c[i];
//}
//
//int main()
//{
//    int T;
//    scanf("%d", &T);
//    while (T--)
//    {
//        scanf("%d%d", &m, &n);
//        for (int i = 0; i < n; i++)    scanf("%d", &a[i]);
//        sort(a, a + n);
//        for (int i = 0; i < m - 1; i++)
//        {
//            for (int i = 0; i < n; i++)    scanf("%d", &b[i]);
//            merge();
//        }
//        for (int i = 0; i < n; i++)    printf("%d ", a[i]);
//        puts("");
//    }
//    return 0;
//}

struct Data
{
    int v, p, k;
    bool operator< (const Data& t) const
    {
        return v > t.v;
    }
};

int main()
{
    int n, k;
    cin >> k >> n;
    n++;
    vector<int> q(1, 1);
    priority_queue<Data> heap;

    while (k--)
    {
        int p;
        cin >> p;
        heap.push({ p, p, 0 });
    }

    while (q.size() < n)
    {
        auto t = heap.top();
        heap.pop();
        q.push_back(t.v);
        heap.push({ t.p * q[t.k + 1], t.p, t.k + 1 });
        while (heap.top().v == t.v)
        {
            auto r = heap.top();
            heap.pop();
            heap.push({ r.p * q[r.k + 1], r.p, r.k + 1 });
        }
    }

    cout << q.back() << endl;
    return 0;
}